package org.gd.exercise.learnspringbootredis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.io.Serializable;

@Configuration
public class LettuceRedisConfig {
    /**
    * @description: 定义Redis的序列化方式
    * @author name: yushanjiang
    * @date: 2025/9/12 8:51
    */
    @Bean
    public RedisTemplate<String, Serializable> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//        System.out.println("自定义 RedisTemplate 配置生效！");
        RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }
}

//  Spring 配置的最佳实践是：通过 @Bean 方法直接定义全新的、完全可控的实例，而非修改框架默认实例。
//  使用@Bean @Configuration是为了表明：
//        1.当前类是个配置类，在容器启动时自动加载
//        2.该类中这个方法返回的结果，将作为bean被容器管理。
//        3. 之后在其他服务中注入的RedisTemplate都是这个，而不是默认的。